package JVM.第03篇_运行时内存篇;

/**
 * ●方法区(Method Area) 与Java堆一样，是各个线程共字的内存区域。
 * ●方法区在JVM启动的时候被创建，并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
 * ●方法区的大小，跟堆空间一样，可以选择固定大小或者可扩展。
 * ●方法区的大小决定了系统可以保存多少个类，如果系统定义了太多的类，导致方法区溢出，
 * 虚拟机同样抛出内存溢出错误: java.lang.OutOfMemoryError: PermGen space
 * 或者 java.lang.OutOfMemoryError: Metaspace
 *      ●加载大量的第三方的jar包: Tomcat部署的 工程过多(30-50个) ;大量动态的生成反射
 * ●关闭JVM就会释放这个区域的内存。
 *
 *
 * StringTable为什么要调整?
 * jdk7中将StringTable放到了堆空间中。
 * 因为永久代的回收效率很低，在full gc的时候才会触发。
 * 而 full gc是老年代的空间不足、永久代不足时才会触发。
 * 这就导致StringTable回收效率不高。而我们开发中会有大量的字符串被创建，
 * 回收效率低，导致永久代内存不足。放到堆里，能及时回收内存。
 *
 * 方法区的垃圾收集主要回收两部分内容:
 *      常量池中废弃的常量和不再使用的类型。
 * 先来说说方法区内常量池之中主要存放的两大类常量:
 *      字面量和符号引用。
 *      字面量比较接近Java语言层次的常量概念，如文本字符串、被声明为final1的常量值等。
 *      而符号引用则属于编译原理方面的概念，包括下面三类常量:
 * ●1、类和接口的全限定名
 * ●2、字段的名称和描述符
 * ●3、方法的名称和描述符
 * ● HotSpot虚拟机对常量池的回收策略是很明确的，只要常量池中的常量没有被任何地方引用，就可以被回
 *
 */
public class J_方法区 {

}
